/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.siteEncheres.client.compte;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
import com.gwtext.client.widgets.form.Label;
import com.gwtext.client.widgets.layout.HorizontalLayout;
import com.gwtext.client.widgets.layout.VerticalLayout;
import domain.Utilisateur;
import org.siteEncheres.client.DoubleBox;

/**
 *
 * @author Francois
 */
public class IhmCrediterCompte extends Panel {

    private TextBox txtNomProprio = new TextBox();
    private TextBox txtPrenomProprio = new TextBox();
    private DoubleBox txtNumCarte = new DoubleBox();
    private DoubleBox txtCrypto = new DoubleBox();
    private DoubleBox txtMontant = new DoubleBox();
    private ListBox listeDateMois = new ListBox();
    private ListBox listeDateAnnee = new ListBox();
    private int idUtilisateurEnCours;
    private Button bouton = new Button("OK");
    
    final AsyncCallback<Utilisateur> callbackGetUtilisateurEnCours = new AsyncCallback<Utilisateur>() {

        @Override
        public void onSuccess(Utilisateur result) {
            idUtilisateurEnCours = result.getIdUtilisateur();
        }

        @Override
        public void onFailure(Throwable caught) {
            String exception = formaterException(caught.getMessage());
            MessageBox.alert(exception);
        }
    };
    
    final AsyncCallback callbackBouton = new AsyncCallback() {

        @Override
        public void onSuccess(Object result) {
            listeDateMois.setItemSelected(0, true);
            listeDateAnnee.setItemSelected(0, true);
            txtNumCarte.setText("");
            txtCrypto.setText("");
            txtNomProprio.setText("");
            txtPrenomProprio.setText("");
            txtMontant.setText("");
        }

        @Override
        public void onFailure(Throwable caught) {
            String exception = formaterException(caught.getMessage());
            MessageBox.alert(exception);
        }
    };
    
    
    public IhmCrediterCompte() {
        setAutoScroll(true);
        setBorder(false);
        setFrame(true);
        setLayout(new VerticalLayout(10));
        //setHeight(200);

        //////////// panel Nom Prenom /////////////////
        Panel panelNP = new Panel();
        panelNP.setBorder(false);
        panelNP.setLayout(new HorizontalLayout(20));

        Panel pNom = new Panel();
        pNom.setLayout(new VerticalLayout());
        pNom.add(new Label("Nom"));
        pNom.add(txtNomProprio);

        Panel pPrenom = new Panel();
        pPrenom.setLayout(new VerticalLayout());
        pPrenom.add(new Label("Prénom"));
        pPrenom.add(txtPrenomProprio);

        panelNP.add(pNom);
        panelNP.add(pPrenom);
        add(panelNP);
        //////////////////////////////////////////////

        //////////// panel Num carte /////////////////
        Panel panelNumCarte = new Panel();
        panelNumCarte.setBorder(false);
        panelNumCarte.setLayout(new HorizontalLayout(20));

        panelNumCarte.add(new Label("Numéro de carte"));
        //txtNumCarte.setPixelSize(300, 15);
        txtNumCarte.setMaxLength(16);
        panelNumCarte.add(txtNumCarte);
        add(panelNumCarte);
        //////////////////////////////////////////////

        //////////// panel Crypto Date Exp /////////////////
        Panel panelCryptoDateExp = new Panel();
        panelCryptoDateExp.setBorder(false);
        panelCryptoDateExp.setLayout(new HorizontalLayout(30));

        Panel panelDateExp = new Panel();
        panelDateExp.setBorder(false);
        panelDateExp.setLayout(new HorizontalLayout(20));
        panelDateExp.add(new Label("Date d'expiration"));

        listeDateMois.addItem("--Mois--");
        for (int i = 1; i <= 12; i++) {
            listeDateMois.addItem(Integer.toString(i));
        }

        listeDateAnnee.addItem("--Année--");
        for (int i = 2012; i <= 2020; i++) {
            listeDateAnnee.addItem(Integer.toString(i));
        }

        panelDateExp.add(listeDateMois);
        panelDateExp.add(listeDateAnnee);
        panelCryptoDateExp.add(panelDateExp);

        Panel panelCrypto = new Panel();
        panelCrypto.setBorder(false);
        panelCrypto.setLayout(new HorizontalLayout(20));
        panelCrypto.add(new Label("Cryptogramme"));
        txtCrypto.setMaxLength(3);
        txtCrypto.setPixelSize(30, 15);
        panelCrypto.add(txtCrypto);
        panelCryptoDateExp.add(panelCrypto);

        add(panelCryptoDateExp);
        //////////////////////////////////////////////
        
        //////////// panel Montant /////////////////
        Panel panelMontant = new Panel();
        panelMontant.setBorder(false);
        panelMontant.setLayout(new HorizontalLayout(20));

        panelMontant.add(new Label("Montant"));
        txtMontant.setWidth("50");
        panelMontant.add(txtMontant);
        add(panelMontant);
        //////////////////////////////////////////////
     
        add(bouton);
        
        //On recupere l utilisateur en cours pour savoir quel compte
        //crediter.
        getService().getUtilisateurEnCours(callbackGetUtilisateurEnCours);
        addListener(new PanelListenerCrediter());
        
        bouton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent w) {
                String mois = listeDateMois.getValue(listeDateMois.getSelectedIndex());
                String annee = listeDateAnnee.getValue(listeDateAnnee.getSelectedIndex());

                //Si les champs obligatoires sont vides
                if(!verifChampsVide()){
                    MessageBox.alert("Un ou plusieurs champs sont vide.\nVeuillez les renseignés.");
                }
                else{
                    int crypto = Integer.parseInt(txtCrypto.getText());
                    String date = mois+"/"+annee;
                    Double montant = Double.parseDouble(txtMontant.getText());
                    getService().crediterCompte(txtNumCarte.getText(), crypto, date, txtNomProprio.getText(), txtPrenomProprio.getText(), montant, idUtilisateurEnCours, callbackBouton);
                }
            }
        });
    }
    
    public static GwtCompteAsync getService() {
        return GWT.create(GwtCompte.class);
    }
    
    private class PanelListenerCrediter extends PanelListenerAdapter {

        @Override
        public void onExpand(Panel panel) {
            //Lorque la fenetre s'ouvre, on remet les champs a vide.
            txtNomProprio.setText("");
            txtPrenomProprio.setText("");
            txtMontant.setText("");
            txtCrypto.setText("");
            txtNumCarte.setText("");
            listeDateMois.setItemSelected(0, true);
            listeDateAnnee.setItemSelected(0, true);
        }
    }
    
    /**
     * 
     * @return vrai si les champs obligatoires ont ete remplis, faux sinon.
     */
    public boolean verifChampsVide() {
        if (txtNomProprio.getText().compareTo("") == 0) {
            return false;
        }
        if (txtPrenomProprio.getText().compareTo("") == 0) {
            return false;
        }
        if (txtNumCarte.getText().compareTo("") == 0) {
            return false;
        }
        if (txtCrypto.getText().compareTo("") == 0) {
            return false;
        }
        if (txtMontant.getText().compareTo("") == 0) {
            return false;
        }

        String mois = listeDateMois.getValue(listeDateMois.getSelectedIndex());
        String annee = listeDateAnnee.getValue(listeDateAnnee.getSelectedIndex());

        if ((mois.compareTo("--Mois--") == 0)
        || (annee.compareTo("--Année--") == 0)) {
                return false;
        }
        
        return true;
    }
    
    /**
     * Méthode servant a separer le "java.lang.Exception:" du
     * message de l'exception qu on ne veut pas a l affichage.
     * 
     * @param exception Message contenu dans l exception.
     * @return ce qu il y a apres le "java.lang.Exception"
     * si cette chaine est presente, le message en entier sinon.
     */
    public String formaterException(String exception){
        String[] split = exception.split(":");
        if(split[0].compareTo("java.lang.Exception") == 0){
            return split[1];
        }
        else return exception;
    }
}
